//最高16进制，故定义一个16进制字符集
const CHARSET: [char; 16] = [
    '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f',
];

pub fn convert_base(num_str: &str, to_base: u32) -> String {
    // TODO: 这里写逻辑
    // 先将输入的各种进制的数字都转换为十进制
    // 再将十进制数字转换为目标进制
    let (num_part, from_base) = parse_input(num_str);
    let num_decimal = base_to_decimal(num_part, from_base);
    decimal_to_base(num_decimal, to_base)
}

// 从输入字符串中解析出数字和进制
pub fn parse_input(num_str: &str) -> (&str, u32) {
    let parts: Vec<&str> = num_str.split("(").collect();
    let num_part = parts[0];
    let from_base = parts[1]
        .trim_end_matches(')')
        .parse() // 将字符串转换为数字
        .expect("from base is not a number");
    // println!("num_part: {}, from_base: {}", num_part, from_base);
    (num_part, from_base)
}

// 将各种进制转换为十进制数字
pub fn base_to_decimal(num_str: &str, from_base: u32) -> u32 {
    let mut sum = 0;
    for ch in num_str.chars() {
        let digit = ch.to_digit(from_base).expect("invalid digit");
        sum = sum * from_base + digit;
    }
    // println!("sum: {}", sum);
    sum
}

//将十进制数字转换为各种进制
pub fn decimal_to_base(mut num: u32, to_base: u32) -> String {
    let mut result = String::new();
    while num > 0 {
        let remainder = num % to_base;
        result.push(CHARSET[remainder as usize]);
        num /= to_base;
    }
    //取反
    result.chars().rev().collect()
}
